package com.remoting.core.request;

import com.remoting.api.expression.ExpressionParser;
import com.remoting.api.registry.bean.HostInfo;
import com.remoting.api.registry.bean.ServiceImportInfo;
import com.remoting.api.request.RequestHandler;
import com.remoting.core.exception.DataParseException;
import com.remoting.tools.TokenUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * 请求解析器
 * <p>说明:</p>
 * <li></li>
 * @author DuanYong
 * @since 2018年12月27日下午1:56:04
 */
public class DefaultRequestHandler implements RequestHandler {
	/** 表达式解析 */
	private ExpressionParser expressionParser;
	
	@Override
	public RequestHandler init(ExpressionParser expressionParser) {
		this.expressionParser = expressionParser;
		return this;
	}
	
	/**
     * 解析值
     * <p>说明:</p>
     * <li></li>
     * @param serviceInfo 服务信息
     * @param host 主机信息
     * @param data 参数
     * @param value 值
     * @return 解析后的值
     * @since 2017年3月20日下午5:48:44
     */
	@Override
	public String parserValue(ServiceImportInfo serviceInfo, HostInfo host, Map<String,Object> data, String value) {
		//如果引用了系统变量
		if(StringUtils.isNotBlank(value) && value.startsWith("#")){
			//如果包含系统变量accessToken，则生成accessToken
			if(value.contains(HostInfo.ACCESS_TOKEN_KEY)){
				return TokenUtils.genToken(host.getAppKey(), host.getSecretKey(),host.getScope(), serviceInfo.getApi());
			}
			//如果包含系统变量livemode，则获取配置中的livemode
			if(value.contains(HostInfo.LIVEMODE_KEY)){
				return host.getLivemode();
			}
			//如果包含系统变量appKey，则获取配置中的appKey
			if(value.contains(HostInfo.APP_KEY)){
				return host.getAppKey();
			}
			//如果包含系统变量secretKey，则获取配置中的secretKey
			if(value.contains(HostInfo.SECRET_KEY)){
				return host.getSecretKey();
			}
		}
		//解析参数值中的表达式
		return expressionParser(value,data);
	}
	/**
     * 解析KEY
     * <p>说明:</p>
     * <li></li>
     * @author DuanYong
     * @param key key
     * @param value 值
     * @param data 数据
     * @since 2017年6月21日下午3:44:58
     */
	@Override
	public void parserKey(String key, String value, Map<String, Object> data) {
		if (key.contains("[")) {
			try{
				this.expressionParser.setValue(key, value, data);
			}catch(Exception ex){
				ex.printStackTrace();
				throw new DataParseException("表达式解析失败! 表达式 ="+key);
			}
		}
	}
    /**
     * 表达式解析
     * <p>说明:</p>
     * <li></li>
     * @param exp
     * @param data
     * @return
     * @since 2017年3月3日下午4:31:12
     */
	private String expressionParser(String exp, Map<String,Object> data) {
		if (exp.contains("[")) {
			try{
				Object obj = this.expressionParser.getValue(exp, data);
				if(null != obj){
					return (String) obj;
				}
			}catch(Exception ex){
				ex.printStackTrace();
				throw new DataParseException("表达式解析失败! 表达式 ="+exp);
			}
		}
		return exp;
	}

	
	
	

}
